<?php
/**
 * If you are not authorized to modify this file, do NOT touch it.
 * @file security.func.php
 * @author SkyWorld
 * @date 2011-9-17
 * @description This file contains all funtions about framework's safty
 **/

if(!defined('IN_SKY')) exit ('Access Denied.');
	/**
	 * @name  code
	 * @author SkyWorld
	 * @date 2011-9-17
	 * @description  this function is used to decoce or encode a string
     * @parameters  $string original string to be dncode or ciphertext to be encode
     * 				$option option(ENCODE | DECODE), default is DECODE
     * 				$key	the key used to decoding or encoding
     * 				$expiry the period of validity of ciphertext, 0 is valid forever
     * @reference http://wenku.baidu.com/view/e150b820dd36a32d737581f5.html
     * @return $string ciphertext  or  original string
     * @example
	 *  $a = code('abc', 'ENCODE', 'key');
	 *  $b = code($a, 'DECODE', 'key');  // $b(abc)
	 *
	 *  $a = code('abc', 'ENCODE', 'key', 3600);
	 *  $b = code('abc', 'DECODE', 'key');
     * @warning This code comes form the Internet, If you want use it in commercial way
     * 			please get contract with the original author
     **/
function code($string, $operation = 'DECODE', $key = '', $expiry = 3600)
{

    $ckey_length = 4;
  	$key = md5($key ? $key : 'skyworld');
  	$keya = md5(substr($key, 0, 16));
  	$keyb = md5(substr($key, 16, 16));
  	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

  	$cryptkey = $keya.md5($keya.$keyc);
  	$key_length = strlen($cryptkey);

  	$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  	$string_length = strlen($string);

  	$result = '';
  	$box = range(0, 255);

  	$rndkey = array();
  	for($i = 0; $i <= 255; $i++)
  	{
    	$rndkey[$i] = ord($cryptkey[$i % $key_length]);
  	}

  	for($j = $i = 0; $i < 256; $i++)
  	{
    	$j = ($j + $box[$i] + $rndkey[$i]) % 256;
    	$tmp = $box[$i];
    	$box[$i] = $box[$j];
    	$box[$j] = $tmp;
  	}
	unset($rndkey);
  	for($a = $j = $i = 0; $i < $string_length; $i++)
  	{
	   $a = ($a + 1) % 256;
	   $j = ($j + $box[$a]) % 256;
	   $tmp = $box[$a];
	   $box[$a] = $box[$j];
	   $box[$j] = $tmp;
	   $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  	}

    if($operation == 'DECODE')
    {
       if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16))
       {
           return substr($result, 26);
       }
       else
       {
           return '';
       }
    }
    else
    {
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}
?>
